﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LearnCSharp
{
    /*
        * *************************************************************************************
        * *************************************************************************************
        *                                      TABLEAU
        * *************************************************************************************
        * *************************************************************************************
    */
    /// <summary> TableauCSharp </summary>
    public class TableauCSharp
    {
        private void UseTableau()
        {
            // Déclaration & initialisation
            int[] t1;           // Référence du tableau
            t1 = new int[3];    //Référence pointant maintenant sur un tableau de 3 cases int init à 0
            foreach (int i in t1) Console.WriteLine(" foreach taleau t1: {0}", i);

            int[] t2 = new int[3];

            int[] t3 = new int[] { 1, 2, 3 };
            foreach (int i in t3) Console.WriteLine(" foreach taleau t3: {0}", i);

            int[] t4 = { 10, 20, 30 };
            foreach (int i in t4) Console.WriteLine(" foreach taleau t4: {0}", i);

            // Variable de type référence
            int[] t5 = { 11, 22, 33 };
            int[] t6;

            t6 = t5;
            t5[0] = 1; t5[1] = 2; t5[2] = 3;
            foreach (int i in t6) Console.WriteLine(" foreach taleau t6: {0}", i);

            // Exception : IndexOutOfRangeException
            try
            {
                t5[666] = 666;
            }
            catch (IndexOutOfRangeException e)
            {
                Console.WriteLine(" Exception taleau : {0}", e);
            }

            Console.ReadLine();
        }

        // Tableau de différent type
        private void UseTableauCelluleDiff()
        {
            // Déclaration et initialisation
            object[] tabObj = new object[3];
            tabObj[0] = 10;
            tabObj[1] = 2.56;
            tabObj[2] = "toto";
            if (tabObj[0] is int && tabObj[1] is double && tabObj[2] is string
                ||
                tabObj[0].GetType() == typeof(int) && tabObj[1].GetType() == typeof(double) && tabObj[2].GetType() == typeof(string))
            {
                foreach (object i in tabObj) Console.WriteLine(" foreach taleau obj diff tabObj: {0}, {1}", i, i.GetType().ToString());
            }

            // Déclaration et initialisation VIDE
            object[] tabObj2 = new object[3];
            if (tabObj2[0] == null)
                foreach (object i in tabObj2) Console.WriteLine(" foreach taleau obj diff tabObj2: {0}", i);
        }

        // Copie de tableau
        private void CopieTableau()
        {
            int[] t1 = { 10, 20, 30 };
            int[] t2;

            // Par défaut : copie par référence
            t2 = t1;
            t1[0] = 111;
            foreach (object i in t2) Console.WriteLine(" foreach taleau t2: {0}", i);

            // Recopie par valeur (Méthode 1)
            t1 = new int[3] { 10, 20, 30 };
            t2 = new int[3];

            t1.CopyTo(t2, 0);
            t1[0] = 111;
            foreach (object i in t2) Console.WriteLine(" foreach taleau t2: {0}", i);

            // Recopie par valeur (Méthode 1)
            t1 = new int[3] { 10, 20, 30 };
            t2 = new int[3];

            t2 = (int[])t1.Clone();
            t1[0] = 111;
            foreach (object i in t2) Console.WriteLine(" foreach taleau t2: {0}", i);

            Console.ReadLine();
        }

        // Tableau à plusieurs dimension
        private void UseTableauPlusieursDim()
        {
            // Déclaration et initialisation
            int[,] t1 = new int[2, 3];           // 2 dimensions
            double[,] t2 = { { 1.1, 1.2, 1.3 }, { 2.1, 2.2, 2.3 } };

            int[, ,] t3 = new int[2, 3, 4];        // 3 dimensions

            int[, , ,] t4 = new int[2, 3, 4, 5];     // 4 dimensions


			Console.WriteLine(" Nombre de cellule de la 1er dimension de t4: {0}", t4.GetLength(0).ToString()); 

            foreach (object i in t2) Console.WriteLine(" foreach taleau t2: {0}", i);

            Console.ReadLine();
        }

        // Tableau déchiqueté
        private void UseTableauDechiquete()
        {
            int[][] t;
            t = new int[2][];
            t[0] = new int[3];
            t[1] = new int[] { 10, 20, 30, 40, 50, 60 };

            Console.WriteLine(" taleau dechiqueté t: {0}", t[1][2]);

            foreach (int[] i in t)
            {
                foreach (int j in i)
                    Console.WriteLine(" foreach taleau dechiqueté t: {0}", j);
            }

            Console.ReadLine();
        }
    }
}
